package 剑指offer;


/**
 * @author: tyy 剑指 Offer
 * 859. 亲密字符串
给你两个字符串 s 和 goal ，只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果，就返回 true ；否则返回 false 。
交换字母的定义是：取两个下标 i 和 j （下标从 0 开始）且满足 i != j ，接着交换 s[i] 和 s[j] 处的字符。
例如，在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
示例 1：
输入：s = "ab", goal = "ba"
输出：true
解释：你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba"，此时 s 和 goal 相等。
 * @create: 2021-11-20 17:40
 * @description:
 **/
public class Solution30 {
    /**
     * 官方题解, 其实情况没有那么多, 就三种情况:

     字符串长度不相等, 直接返回false
     字符串相等的时候, 只要有重复的元素就返回true
     A, B字符串有不相等的两个地方, 需要查看它们交换后是否相等即可.
     * @param s
     * @param goal
     * @return
     */
    public boolean buddyStrings1(String s, String goal) {
        int len1 = s.length();
        int len2 = goal.length();

        if (len1 == 1 || len2 == 1 || len1 != len2) {
            return false;
        }
        return false;
    }
    public boolean buddyStrings(String s, String goal) {
        if(s.length() != goal.length()) return false; //长度不等，直接返回false
        int sum = 0;
        char arr[] = new char[4];
        int o = 0;
        for(int j = 0;j < s.length();j++){
            if(s.charAt(j)!=goal.charAt(j)) {//遍历
                sum++;
                if(sum > 2) return false; //不相等个数大于2，返回false
                arr[o++] = s.charAt(j);
                arr[o++] = goal.charAt(j); // 记录不相等的字符
            }
        }
        if(sum==0){//全部相等
            for(int k = 0;k < s.length();k++){
                for(int p = k + 1;p < s.length();p++){
                    if(s.charAt(p)==s.charAt(k)) return true; // 有重复，直接返回true
                }
            }
        }
        if(sum == 2){
            if(arr[0]!=arr[3]||arr[1]!=arr[2]) return false; // 两个交叉不相等，说明不符合
            return true; //arr[0]==arr[3] && arr[1]==arr[2]
        }
        return false;
    }
    public static void main(String[] args) {
        Solution30 solution26 = new Solution30();
        String s= "ab";
        String goal = "ba";
        boolean flag = solution26.buddyStrings(s, goal);
        System.out.println("flag = " + flag);

    }
}
